介于上篇我们讲述了基于 Struts2 的单文件和多文件上传,这篇我们来聊一聊基于 Struts2 的文件下载。
1、导 jar 包
commons-io-2.0.1.jar
struts2-core-2.3.15.3.jar
xwork-core-2.3.15.3.jar
struts2-sunspoter-stream-1.2.jar
2、web.xml 配置 Struts2 核心过滤器
12 7 8struts2 34 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 5 69 struts2 10/* 11
3、JSP 文件下载页(注意:链接中 filename 后跟的文件名需与 Action 文件下载路径中已知的文件名一致)
4、实现文件下载上传的 DownloadAction
1 package com.fhcq.action; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.InputStream; 7 import java.io.UnsupportedEncodingException; 8 import javax.servlet.ServletContext; 9 import org.apache.struts2.ServletActionContext; 10 import com.opensymphony.xwork2.ActionSupport; 11 12 public class DownloadAction extends ActionSupport { 13 14 //提供一个InputStream类型的输入流 15 private InputStream inputStream; //注意:在给InputSteam指定名称时,不能使用in 16 //创建一个文件名的属性 17 private String filename; 18 19 public String download() throws FileNotFoundException{ 20 21 //1.找到文件的存储路径 22 ServletContext servletContext = ServletActionContext.getServletContext(); 23 String realPath = servletContext.getRealPath("/WEB-INF/file"); 24 //2.根据文件路径和文件名new一个新文件 25 File file = new File(realPath,filename); 26 27 //3.把文件读到一个InputStream中 28 inputStream = new FileInputStream(file); 29 //4.返回一个SUCCESS 30 return SUCCESS; 31 //5.由一个叫做stream的结果类型为我们把剩下的事情做完。 32 } 33 34 public InputStream getInputStream() { 35 return inputStream; 36 } 37 38 public void setInputStream(InputStream inputStream) { 39 this.inputStream = inputStream; 40 } 41 42 public String getFilename() { 43 44 //解决中文文件名在下载过程出现乱码问题,struts.xml中也需添加charset=iso-8859-1 45 try { 46 filename=new String(filename.getBytes(),"iso-8859-1"); 47 } catch (UnsupportedEncodingException e) { 48 // TODO Auto-generated catch block 49 e.printStackTrace(); 50 } 51 return filename; 52 } 53 54 public void setFilename(String filename) { 55 this.filename = filename; 56 } 57 58 }
5、配置 struts.xml
12 3 4 5 6 7 238 109 11 2212 13 14 application/octet-stream;charset=iso-8859-1 15 16 17 attachment;filename=${filename} 18 19 inputStream 20 21